home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / nan_news / toolkit / shadow.asm < prev    next >
Assembly Source File  |  1991-08-15  |  9KB  |  200 lines

  1. ; File......: SHADOW.ASM
  2. ; Author....: Reginald B. Walton; Modified by Ted Means
  3. ; Date......: $Date:   15 Aug 1991 23:07:26  $
  4. ; Revision..: $Revision:   1.2  $
  5. ; Log file..: $Logfile:   E:/nanfor/src/shadow.asv  $
  6. ; This is an original work by Reginald B. Walton and is placed in the
  7. ; public domain.
  8. ;
  9. ; Modification history:
  10. ; ---------------------
  11. ;
  12. ; $Log:   E:/nanfor/src/shadow.asv  $
  13. ;  
  14. ;     Rev 1.2   15 Aug 1991 23:07:26   GLENN
  15. ;  Forest Belt proofread/edited/cleaned up doc
  16. ;  
  17. ;     Rev 1.1   11 May 1991 00:29:22   GLENN
  18. ;  Major re-write by Ted Means.  He sped it up.  It will also cooperate
  19. ;  with Clipper's internal _gtmaxrow and _gtmaxcol settings.  
  20. ;  
  21. ;     Rev 1.0   02 Apr 1991 18:25:40   GLENN
  22. ;  Nanforum Toolkit
  23. ;
  24. ;
  25.  
  26.  
  27. ;  $DOC$
  28. ;  $FUNCNAME$
  29. ;      FT_SHADOW()
  30. ;  $CATEGORY$
  31. ;      Video
  32. ;  $ONELINER$
  33. ;      Draw a non-destructive shadow on the screen
  34. ;  $SYNTAX$
  35. ;     FT_SHADOW( <nTop>, <nLeft>, <nBottom>, <nRight> ) -> NIL
  36. ;  $ARGUMENTS$
  37. ;     <nTop>    is the top row of the shadow area.
  38. ;
  39. ;     <nLeft>   is the upper left column of the shadow area.
  40. ;
  41. ;     <nBottom> is the bottom row of the shadow area.
  42. ;
  43. ;     <nRight>  is the lower right column of the shadow area.
  44. ;  $RETURNS$
  45. ;     NIL
  46. ;  $DESCRIPTION$
  47. ;     This function was designed to have my application emulate the 
  48. ;     non-destructive shadowing of the PC-TOOLS application. This function
  49. ;     was written in Assembly language for speed since, the same function
  50. ;     written in Clipper was too slow. The size of this function could be
  51. ;     reduced by re-writing the SET_CUR_POSITION, READ_CHARACTER, and 
  52. ;     WRITE_CHARACTER macros as procedures. Note: this will slow it down
  53. ;     a tad, since stack manipulation will be involved.
  54. ;
  55. ;     1.  If you are using the SAVESCREEN() function to save your screen,
  56. ;         remember to save enough screen for the shadow. The shadow will
  57. ;         require 1 row and 2 columns.
  58. ;
  59. ;             save_win = SAVESCREEN(Trow,Tcol,Brow+1,Bcol+2)
  60. ;
  61. ;     2.  *** INTERNALS ALERT ***  This function uses several Clipper internal 
  62. ;         routines.  If using internals scares you, then stay away from this
  63. ;         function, you gutless weasel.
  64. ;
  65. ;     The source code is written to MASM specifications.  To use another
  66. ;     assembler, either invoke that assembler's MASM compatibility switch,
  67. ;     or make the required modifications to the source code.
  68. ;  $EXAMPLES$
  69. ;     LOCAL Save_Win := SaveScreen(10,10,21,52)  // save enough for the shadow
  70. ;     FT_SHADOW(10,10,20,50)                     // draw shadow
  71. ;
  72. ;        ...
  73. ;          do what ya' like
  74. ;        ...
  75. ;
  76. ;     RestScreen(10,10,21,52,Save_Win)        // restore screen
  77. ;     RETURN
  78. ;  $END$
  79.  
  80.  
  81. Public   FT_SHADOW
  82.  
  83. TopRow   EQU       Word Ptr BP - 2           ; Top row
  84. TopCol   EQU       Word Ptr BP - 4           ; Top column
  85. BotRow   EQU       Word Ptr BP - 6           ; Bottom row
  86. BotCol   EQU       Word Ptr BP - 8           ; Bottom column
  87. MaxRow   EQU       Word Ptr BP - 10          ; MaxRow()
  88. MaxCol   EQU       Word Ptr BP - 12          ; MaxCol()
  89.  
  90. Extrn    __ParNI:Far
  91. Extrn    __Ret:Far
  92. Extrn    __gtMaxRow:Far                      ; INTERNAL!!! INTERNAL!!!
  93. Extrn    __gtMaxCol:Far                      ; INTERNAL!!! INTERNAL!!!
  94. Extrn    __No_Snow:Word                      ; INTERNAL!!! INTERNAL!!!
  95.  
  96. _NanFor  Segment   Word      PUBLIC    'CODE'
  97.          Assume    CS:_NanFor
  98.  
  99. FT_SHADOW          Proc      Far
  100.  
  101.          Push      BP                        ; Save BP
  102.          Mov       BP,SP                     ; Set up stack reference
  103.          Sub       SP,12                     ; Allocate room for locals
  104.  
  105.          Call      __gtMaxRow                ; Get maxrow()
  106.          Mov       [MaxRow],AX               ; Store it
  107.          Call      __gtMaxCol                ; Get maxcol()
  108.          Mov       [MaxCol],AX               ; Store it
  109.  
  110.          Mov       AX,1                      ; Specify param #
  111.          Push      AX                        ; Put on stack
  112.          Call      __ParNI                   ; Retrieve value
  113.          Mov       [TopRow],AX               ; Store it in TopRow
  114.  
  115.          Mov       AX,2                      ; Specify param #
  116.          Push      AX                        ; Put on stack
  117.          Call      __ParNI                   ; Retrieve value
  118.          Mov       [TopCol],AX               ; Store it in TopCol
  119.  
  120.          Mov       AX,3                      ; Specify param #
  121.          Push      AX                        ; Put on stack
  122.          Call      __ParNI                   ; Retrieve value
  123.          Mov       [BotRow],AX               ; Store it in BotRow
  124.  
  125.          Mov       AX,4                      ; Specify param #
  126.          Push      AX                        ; Put on stack
  127.          Call      __ParNI                   ; Retrieve value
  128.          Mov       [BotCol],AX               ; Store it in BotCol
  129.  
  130.          Xor       AX,AX                     ; Clear AX
  131.          Mov       ES,AX                     ; Set ES to low memory
  132.          Mov       AX,0B800h                 ; Default to color
  133.          Cmp       [ES:463h],3B4h            ; Monochrome present?
  134.          JNE       Vertical                  ; If not, continue
  135.          Mov       AX,0B000h                 ; Switch to mono video base
  136.  
  137. Vertical:Mov       ES,AX                     ; Initalize video base
  138.          Mov       AX,[TopRow]               ; Get top row
  139.          Inc       AX                        ; Start one row down
  140.          Mov       DX,[MaxCol]               ; Get maxcol()
  141.          Inc       DX                        ; Compensate for zero start
  142.          Mul       DX                        ; Calculate offset of row, 0
  143.          Add       AX,[BotCol]               ; Now get offset of last column
  144.          Inc       AX                        ; Go one past for shadow location
  145.          SHL       AX,1                      ; Multiply by two
  146.          Inc       AX                        ; Point to attribute byte
  147.          Mov       BX,AX                     ; Move offset to BX
  148.          Mov       CX,[BotRow]               ; Get last row
  149.          Sub       CX,[TopRow]               ; Subtract first row
  150.  
  151. VTop:    Cmp       [__No_Snow],0             ; Snow check in effect?
  152.          JE        VSetAttr                  ; If not, continue
  153.          Mov       DX,3DAh                   ; Specify status port
  154. VWait:   In        AL,DX                     ; Get status
  155.          Test      AL,8                      ; Vertical retrace in progress?
  156.          JZ        VWait                     ; No, so wait for it
  157. VSetAttr:Mov       Byte Ptr [ES:BX],7        ; Set shadow attribute
  158.          Mov       Byte Ptr [ES:BX + 2],7    ; Set shadow attribute
  159.          Mov       DX,[MaxCol]               ; Get maxcol
  160.          Inc       DX                        ; Compensate for zero start
  161.          SHL       DX,1                      ; Multiply by two
  162.          Add       BX,DX                     ; Set offset to next column
  163.          Loop      VTop                      ; Do next row
  164.  
  165. Horizontal:
  166.          Mov       AX,[BotRow]               ; Get bottom row
  167.          Inc       AX                        ; Go one past for shadow
  168.          Mov       DX,[MaxCol]               ; Get maxcol()
  169.          Inc       DX                        ; Compensate for zero start
  170.          Mul       DX                        ; Calculate offset of row, 0
  171.          Add       AX,[TopCol]               ; Now get offset of first column
  172.          Inc       AX                        ; Start one column in
  173.          SHL       AX,1                      ; Multiply by two
  174.          Inc       AX                        ; Point to attribute byte
  175.          Mov       BX,AX                     ; Move offset to BX
  176.          Mov       CX,[BotCol]               ; Get last column
  177.          Sub       CX,[TopCol]               ; Subtract first column
  178.          Add       CX,2                      ; Calulate loop terminal value
  179.  
  180. HTop:    Cmp      [__No_Snow],0              ; Snow check in effect?
  181.          JE       HSetAttr                   ; If not, continue
  182.          Mov      DX,3DAh                    ; Specify status port
  183. HWait:   In       AL,DX                      ; Get status
  184.          Test     AL,8                       ; Vertical retrace in progress?
  185.          JZ       HWait                      ; No, so wait for it
  186. HSetAttr:Mov      Byte Ptr [ES:BX],7         ; Set shadow attribute
  187.          Add      BX,2                       ; Set offset to next column
  188.          Loop     HTop                       ; Do next row
  189.  
  190. Exit:    Mov       SP,BP
  191.          Pop       BP
  192.          Call      __Ret                     ; Return NIL
  193.          Ret                                 ; Go on back to Clipper
  194.  
  195. FT_SHADOW          Endp
  196. _NanFor            Ends
  197. End
  198. 
  199.